<?php
if(!defined('BASE_DIR'))die('Cannot access the file !');
/**
 * -+-----------------------------------------
 * |PHP Framework
 * |Copyright (c) 2010 jinke.[iblue.cc]
 * |E-mail: mejinke@gmail.com
 * |Date: 2010-01-08
 * -+-----------------------------------------
 *
 * 数据库操作相关工具
 * @author jinke
 */
class DBTool extends Base
{

	/**
	 * 条件数组格式化
	 * @access public
	 * @param mixed $var 条件数组或字符串
	 * @return string
	 */
	public static function whereFormat($var)
	{

		if (!is_array($var))
			return $var;
		else
		{	$string = '';
			foreach ($var as $key=>$val)
			{
				$val = self::escape($val);
				$arr = explode(',',$key);
				$arr[1] = isset($arr[1])?$arr[1]:'=';
				$string .= empty($string)?"(`".$arr[0]."`".$arr[1]."'".$val."')":" AND (`".$arr[0]."`".$arr[1]."'".$val."')";
			}
			return $string;
		}
	}
	
	
	/**
	 * 条件数组格式化 MongoDB
	 * @access public
	 * @param mixed $var 条件数组或字符串
	 * @return string
	 */
	public static function whereFormatFromMongoDB($var)
	{
		$array = array();
		foreach($var as $k => $v)
	 	{	
	 		$arr = explode(',',$k);
			$arr[1] = isset($arr[1])?$arr[1]:'';
			if ($arr[1]=='')
	 			$array[$arr[0]] = $v;
	 		else
	 		{
	 			if ($arr[1]=='>')
	 				$array[$arr[0]]['$gt'] = $v;
	 			elseif ($arr[1]=='<')
	 				$array[$arr[0]]['$lt'] = $v;
	 		} 	
	 	}
	 	return $array;
	}
	
	/**
	 * 查询指定的字段格式化
	 * @access public
	 * @param mixed $var 字符串或数组 
	 * @return string
	 */
	public static function findFormat($var)
	{
		if (!is_array($var))
			return $var;
		else 
		{
			$string = '';
			for($i = 0; $i< count($var); $i++)
			{
				if ($i == 0)
					$string ='`'.$var[$i].'`';
				else 
					$string .=',`'.$var[$i].'`';
			}
			return $string;
		}
	}
	
	/**
	 * 查询指定的字段格式化 MongoDB
	 * @access public
	 * @param mixed $var 字符串或数组 
	 * @return string
	 */
	public static function findFormatFromMongoDB($var)
	{
		$array = array();
		if (!is_array($var))
		{
			$tep = explode(',', $var);
			for ($i=0; $i<count($tep); $i++)
			{
				$array[$tep[$i]] = 1;
			}
		}
		else 
		{
			$tep = array_values($var);
			for ($i=0; $i<count($tep); $i++)
			{
				$array[$tep[$i]] = 1;
			}
		}
		
		return $array;
	}


	/**
	 * 获取config.php 中配置的数据库名称
	 * @access public
	 * @param string $var db_list 键名称
	 * @return string 返回一个数据库名称
	 */
	public static function getDBName($var = null)
	{
		$dbs = Config::get('database');
		$dblist = $dbs['db_list'];

		//如果没有数据库key，则使用配置的第一个数据库名称
		if (empty($var))
		{
			if (count($dblist)>0)
			{
				$key = array_keys($dblist);
				return $dbs['db_prefix'].$dblist[$key[0]];
			}
			return $var;
		}
		else
		{
			//如果没有预期的数据库名称，则回返当前key名称
			return isset($dblist[$var])? $dbs['db_prefix'].$dblist[$var]:$var;
		}
	}


	/**
	 * 对SQL中特殊的字符进行过滤处理
	 * @access public
	 * @param string $value 需要处理的字符串
	 * @return string
	 */
	public static function escape($value)
	{
		if(is_null($value))return 'NULL';
		if(is_bool($value))return $value ? 1 : 0;
		if(is_int($value))return (int)$value;
		if(is_float($value))return (float)$value;
		if(@get_magic_quotes_gpc())$value = stripslashes($value);
		return mysql_escape_string($value);
	}
	
	
	/**
	 * 将查询到的记录转换为实体对象
	 * @access public
	 * @param mixed $val 数据记录[引用传递]
	 * @param model $model
	 */
	public static function toEntityObject(&$val, $model)
	{
		if (!is_array($val)) return $val;
		
		$modelName = get_class($model);
		$mf = Functions::REG('M_MODEL_INIT_LIST_FILE');
		$dir = str_replace('models/'.$modelName.'.class.php', '', $mf[$modelName]).'entity/';
		$modelName = $modelName.'Entity';
		$file = $dir.$modelName.'.class.php';
		
		if (!is_file($file))
		{	
			//动态创建MODEL实体类文件
			Files::mkdirs($dir);
			$content="<?php\nclass ".$modelName." extends TableEntity\n{\n\t";
			$content.="public function __construct(&\$array)\n\t{\n\t\tparent::__construct(\$array);\n\t}\n}\n?>";
			Files::write($file, $content,'w+');
		}
		require_once $file;
	
		//处理多维数据
		$_val = null;
		if (isset($val[0]))
		{
			for ($i=0; $i<count($val); $i++)
			{
				$obj = new $modelName($val[$i]);
				$obj->setPk($model->getPk());
				$_val[] = $obj;
			}
			$val = $_val;
		}
		else
			$val = new $modelName($val);
		return $val;
	}
}
?>